package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 通过提高每次读写的数据量，减少实际读写硬件的次数，从而提高读写效率
 *
 * 一组字节一组字节的读写称为:块读写
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("image.png");//用于从 image.png 文件中读取字节数据。
        FileOutputStream fos = new FileOutputStream("image_cp2.png");
        int len;//用于保存每次从输入流中读取的字节数。
        /*
            1位2进制    1bit
            8位2进制    1byte  1字节
            1024byte   1kb
            1024kb     1mb
            1024mb     1gb
            1024gb     1tb
         */
        byte[] buf = new byte[1024*10];//new byte[1024*10] 表示在内存中分配一个长度为 10240 字节的数组。
        long start = System.currentTimeMillis();
        while((len = fis.read(buf))!=-1){
            /*//fis.read(buf)  从输入流中读取最多 buf.length 个字节到 buf 数组中。返回值 len 表示本次实际读取的字节数。
                             //当返回 -1 时，表示已经读到文件末尾。
           // fos.write(buf, 0, len)    将 buf 数组中从索引 0 开始的 len 个字节写入输出流。这样可以避免写入数组中未使用的部分。*/
            fos.write(buf,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时:"+(end-start)+"ms");
        fis.close();
        fos.close();
    }
}
